---
title: Class类
description: Class 对象实际上描述的是一个类型，可能是类，也可能不是类。Class 类是一个描述类型的类。
---
```java title='Class 是一个描述类型标识的类。'
Class<Integer> integerClass = int.class;
Class<Integer> integerClass1 = Integer.class;
System.out.println("integerClass1 = " + integerClass1);//integerClass1 = class java.lang.Integer
System.out.println("integerClass = " + integerClass); //integerClass = int
```
在程序运行期间，Java 运行时系统会为所有对象维护一个运行时类型标识。这个信息会跟踪每个对象所属的类。虚拟机根据运行时类型信息选择要执行的正确方法。

可以使用特殊的 Java 类访问这些信息，保存这些信息的类名为 Class 。
```java title='Object 类中的 getClass() 方法将会返回一个 Class 类型的实例。'
Empolyee e = new Empolyee();
Class<? extends Empolyee> clazz = e.getClass();
System.out.println("clazz = " + clazz);
```
就像 Employee 对象描述一个特定员工的属性一样，**Class 对象会描述一个特定类的属性**。可能最常用的 Class 方法就是 getName。这个方法将返回类的全限定类名。

```java
System.out.println(e.getClass().getName() + " " + e.getName());  //pub.wkq.java.inheritance.Empolyee null
```
如果类在一个包中，包名也作为类名的一部分。



```java title='还可以使用静态方法 forName 获得类名对应的 Class 对象'
String className = "java.util.Random";
Class<?> cl = Class.forName(className);
```

如果类名保存在一个字符串中，这个字符串还在运行时变化，就可以使用这个方法。如果 className 是一个类名或接口名，这个方法会正常执行。否则，forName 将抛出一个检查型异常（checked exception）
。无论何时使用这个方法，都应该提供一个异常处理器。

获得 Class 类对象的第三种方法是一个很方便的快捷方式。如果 T 是任意的 Java 类型（或 void 关键字），T.class 就是匹配的类对象。
```java
Class<Random> randomClass = Random.class;
Class<Integer> intClass = int.class;
Class<Double[]> doubleArrayClass = Double[].class;
```

**Class 对象实际上描述的是一个类型，可能是类，也可能不是类。例如 ，int 不是类，但 int.class 确实是一个 Class 类型的对象。**
:::tip
Class 类实际上是一个泛型类。例如 Employee.class 的 类型是 `Class<Employee>`
:::

虚拟机会为每个类型管理一个唯一的 Class 对象。因此，可以使用 == 运算符比较两个类对象。
```java title='例如'
if(e.getClass() == Employee.class)...
```
如果 e 是一个 Employee 实例，则这个测试将通过。与条件 `e instanceof Employee` 不同， 如果 e 是某个子类(如 Manager ) 的实例，则这个测试将失败。

如果有一个 Class 类型的对象，可以用它构造类的实例。调用 getConstructor 方法将得到一个 Constructor 类型的对象，然后可以使用 newInstance 方法来构造一个实例。

```java
var className = "java.util.Random";
Class<?> aClass = Class.forName(className);
if (aClass.getConstructor().newInstance() instanceof Random random) {
    System.out.println("random = " + random);
}
```

如果这个类没有无参数的构造器，则 getConstructor 方法会抛出一个异常。


